package shelly.basic.class02;

import java.util.Arrays;

/**
 * @author: Shelly
 * @create: 2023-01-15 10:09:08
 * @describe: 两数交换不用额外空间，但是i 和 j 的内容不能相同，不然最终都会变成 0
 */
public class Code01_Swap {
    public static void main(String[] args) {
        int[] arr = {2,3,4,5,6,6,7,1,-3};
        swap(arr,4,5);
        System.out.println(arr[4]);
        System.out.println(arr[5]);
        System.out.println(Arrays.toString(arr));
        swap(arr,4,4);// 交换的不能是同一个内存地址的数
        System.out.println(Arrays.toString(arr));

        // 因为m和n是两块空间，所以不会变0
        int m = 6;
        int n = 6;
        m = m ^ n;// m = 0
        n = m ^ n;// n = 6
        m = m ^ n;// m = 622222222222222
        System.out.println(6^6);

        System.out.println("==============");
        int k = 6;
        int j = 6;
        swap2(k,j);
        swap2(k,k);
    }
    // 这种交换方式，必须确保i!=j
    // 因为 i = j 的话，指的同一个内存地址
    public static void swap(int[] arr,int i,int j){
        //if (i != j) {
            arr[i] = arr[i] ^ arr[j];
            arr[j] = arr[i] ^ arr[j];
            arr[i] = arr[i] ^ arr[j];
        //}
    }
    // 因为m和n是两块空间，所以不受影响
    // 就算入参是同一个数，也会赋值给不同空间的临时变量
    public static void swap2(int m,int n){// 但是不影响外部的变量的值
        m = m ^ n;
        n = m ^ n;
        m = m ^ n;
        System.out.println(m);
        System.out.println(n);
    }
}
